package servlets;

import java.io.IOException;
import java.sql.Date;
import java.text.ParseException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import utiles.FuncionesImpl;

import capaLogica.Ciudad;
import capaLogica.CiudadBO;
import capaLogica.Favorito;
import capaLogica.Noticia;
import capaLogica.NoticiaBO;
import capaLogica.PerfilBO;
import capaLogica.PerfilConcurso;
import capaLogica.PerfilFestival;
import capaLogica.PerfilGrupo;
import capaLogica.PerfilSala;
import capaLogica.Usuario;
import capaLogica.UsuarioBO;

/**
 * Servlet implementation class FrontController
 */
public class UsuarioCO extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public UsuarioCO() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String accion = request.getParameter("accion");
		try {
			procesarAccion(accion, request, response);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void procesarAccion(String accion, HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException, ParseException {
		if (accion.equals("login")) {
			login(request, response);
		} else if (accion.equals("logout")) {
			logout(request, response);
		} else if (accion.equals("registrarse")) {
			registrarUsuario(request, response);
		} else if (accion.equals("entrar")) {
			entradaNoLogueada(request, response);
		}else if (accion.equals("crearUsuario")) {
			crearUsuario(request, response);
		}else if (accion.equals("crearPerfil")) {
			crearPerfil(request, response);
		}else if (accion.equals("editarPerfil")) {
			editaPerfil(request, response);
		}else if (accion.equals("pestanaPerfilNoEditable")) {
			pestanaPerfilNoEditable(request, response);
		}else if ( accion.equals("listarFavoritos")){
			listarFavoritos(request,response);
		}else if ( accion.equals("verPerfilExterno")){
			verPerfilExterno(request,response);
		}else if ( accion.equals("misFavoritos")){
			misFavoritos(request,response);
		}else if ( accion.equals("verPerfil2")){
			verPerfilExterno2(request,response);
		}else if ( accion.equals("cambiarContrasenna") ){
			cambiarContrasenna(request,response);
		}else if ( accion.equals("darseBaja")){
			darseBaja(request,response);
		}
	}
	
	private void darseBaja(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		UsuarioBO userBO = new UsuarioBO();
		HttpSession sesion = request.getSession();
		Usuario usuario = (Usuario)sesion.getAttribute("usuario");
		
		userBO.borrarUsuario(usuario.getIdUsuario());
		request.getRequestDispatcher("index.html").include(request, response);
	}

	private void cambiarContrasenna(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		UsuarioBO userBO = new UsuarioBO();
		HttpSession sesion = request.getSession();
		Usuario usuario = (Usuario)sesion.getAttribute("usuario");
		
		String contrasenna = request.getParameter("pass");
		String confPass = request.getParameter("passconf");
		
		if ( contrasenna.equals(confPass) ){
			usuario.setPassword(contrasenna);
			userBO.actualizaUsuario(usuario);
		}
		
		request.getRequestDispatcher("micuenta.jsp").include(request, response);
		
		
	}

	private void verPerfilExterno2(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		
		String idUser = request.getParameter("idPerfil");
		UsuarioBO userBO = new UsuarioBO();
		Usuario user = userBO.recuperarUsuarioById(idUser);
		String idPerfil = user.getIdPerfil();
		
		if ( "1".equals(user.getIdTipo()) ){
			PerfilBO perfilG = new PerfilBO();
			PerfilGrupo pg = perfilG.recuperarPerfilGrupoById(idPerfil);
			request.setAttribute("perfilExterno", pg);
			request.getRequestDispatcher("perfilGrupoExterno.jsp").include(request, response);
		}
		
		if ( "2".equals(user.getIdTipo()) ){
			PerfilBO perfilG = new PerfilBO();
			PerfilSala pg = perfilG.recuperarPerfilSalaById(idPerfil);
			request.setAttribute("perfilExterno", pg);
			request.getRequestDispatcher("perfilSalaExterno.jsp").include(request, response);
		}
		
		if ( "3".equals(user.getIdTipo()) ){
			PerfilBO perfilG = new PerfilBO();
			PerfilFestival pg = perfilG.recuperarPerfilFestivalById(idPerfil);
			request.setAttribute("perfilExterno", pg);
			request.getRequestDispatcher("perfilFestivalExterno.jsp").include(request, response);
		}
		
		if ( "4".equals(user.getIdTipo()) ){
			PerfilBO perfilG = new PerfilBO();
			PerfilConcurso pg = perfilG.recuperarPerfilConcursoById(idPerfil);
			request.setAttribute("perfilExterno", pg);
			request.getRequestDispatcher("perfilConcursoExterno.jsp").include(request, response);
		}
	}
	
	private void misFavoritos(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String idPerfil = request.getParameter("idPerfil");		
		HttpSession sesion = request.getSession();
		Usuario user = (Usuario)sesion.getAttribute("usuario");
		UsuarioBO userBO = new UsuarioBO();
		Usuario userFavorito = userBO.recuperarUsuarioByPerfil(idPerfil);
		Favorito favorito  = new Favorito();
		favorito.setIdUsuario(user.getIdUsuario());
		favorito.setTipoPerfil(user.getIdTipo());
		favorito.setIdUsuarioFavorito(userFavorito.getIdUsuario());
		PerfilBO pBO = new PerfilBO();
		favorito.setNombreFavorito(pBO.recuperarNombrePerfil(idPerfil));
		userBO.insertarFavorito(favorito);
		request.getRequestDispatcher("usuario?accion=verPerfilExterno&idPerfil="+idPerfil).include(request, response);
		
	}

	private void verPerfilExterno(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String idPerfil = request.getParameter("idPerfil");
		UsuarioBO userBO = new UsuarioBO();
		Usuario user = userBO.recuperarUsuarioByPerfil(idPerfil);
		
		if ( "1".equals(user.getIdTipo()) ){
			PerfilBO perfilG = new PerfilBO();
			PerfilGrupo pg = perfilG.recuperarPerfilGrupoById(idPerfil);
			request.setAttribute("perfilExterno", pg);
			request.getRequestDispatcher("perfilGrupoExterno.jsp").include(request, response);
		}
		
		if ( "2".equals(user.getIdTipo()) ){
			PerfilBO perfilG = new PerfilBO();
			PerfilSala pg = perfilG.recuperarPerfilSalaById(idPerfil);
			request.setAttribute("perfilExterno", pg);
			request.getRequestDispatcher("perfilSalaExterno.jsp").include(request, response);
		}
		
		if ( "3".equals(user.getIdTipo()) ){
			PerfilBO perfilG = new PerfilBO();
			PerfilFestival pg = perfilG.recuperarPerfilFestivalById(idPerfil);
			request.setAttribute("perfilExterno", pg);
			request.getRequestDispatcher("perfilFestivalExterno.jsp").include(request, response);
		}
		
		if ( "4".equals(user.getIdTipo()) ){
			PerfilBO perfilG = new PerfilBO();
			PerfilConcurso pg = perfilG.recuperarPerfilConcursoById(idPerfil);
			request.setAttribute("perfilExterno", pg);
			request.getRequestDispatcher("perfilConcursoExterno.jsp").include(request, response);
		}
		
		
		
	}

	
	private void listarFavoritos(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		
		HttpSession sesion = request.getSession();
		Usuario user = (Usuario)sesion.getAttribute("usuario");
		UsuarioBO userBO = new UsuarioBO();		
		List<Favorito> listaFav = userBO.recuperarFavoritosByIdUsuario(user.getIdUsuario());
		request.setAttribute("listaFav", listaFav);
		request.getRequestDispatcher("favoritos.jsp").include(request, response);
		
	}

	private void editaPerfil(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		
		HttpSession sesion = request.getSession();
		String ruta = "";
		Usuario usuario = (Usuario)sesion.getAttribute("usuario");
		PerfilBO pBO = new PerfilBO();
		UsuarioBO userBO = new UsuarioBO();
		
		if ( "1".equals(usuario.getIdTipo()) ){
			ruta = "editaTuPerfilGrupo.jsp";
			
		}else if ( "2".equals(usuario.getIdTipo()) ){ 
			ruta = "editaTuPerfilSala.jsp";
			
  	 	}else if ( "3".equals(usuario.getIdTipo()) ){ 
			ruta = "editaTuPerfilFestival.jsp";
			
  	 	}else{ 
			ruta = "editaTuPerfilConcurso.jsp";
  	 	}
		
		request.getRequestDispatcher(ruta).include(request,response);	
	}

	private void pestanaPerfilNoEditable(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession sesion = request.getSession();
		
		String ruta = "";
		Usuario usuario = (Usuario)sesion.getAttribute("usuario");
		PerfilBO pBO = new PerfilBO();
		
		if ( "1".equals(usuario.getIdTipo()) ){
			PerfilGrupo perfil = pBO.recuperarPerfilGrupoById(usuario.getIdPerfil());
			sesion.setAttribute("perfil", perfil);
			ruta = "miPerfilGrupoNoEditable.jsp";
			
		}else if ( "2".equals(usuario.getIdTipo()) ){ 
			PerfilSala perfil = pBO.recuperarPerfilSalaById(usuario.getIdPerfil());
			sesion.setAttribute("perfil", perfil);
			ruta = "miPerfilSalaNoEditable.jsp";
			
  	 	}else if ( "3".equals(usuario.getIdTipo()) ){ 
  	 		PerfilFestival perfil = pBO.recuperarPerfilFestivalById(usuario.getIdPerfil());
			sesion.setAttribute("perfil", perfil);
			ruta = "miPerfilFestivalNoEditable.jsp";
			
  	 	}else{ 
  	 		PerfilConcurso perfil = pBO.recuperarPerfilConcursoById(usuario.getIdPerfil());
			sesion.setAttribute("perfil", perfil);
			ruta = "miPerfilConcursoNoEditable.jsp";
  	 	}
		
		request.getRequestDispatcher(ruta).include(request,response);
	}

	private void crearPerfil(HttpServletRequest request,
			HttpServletResponse response) throws ParseException, ServletException, IOException {
		HttpSession sesion = request.getSession();
		
		//RECUPERAMOS LAS VARIABLES DEL FORMULARIO
		
		String tipoPerfil = request.getParameter("tipoPerfil");
		
		//TIPO GRUPO
		String nombreGrupo = request.getParameter("nombre");
		String emailGrupo = request.getParameter("email");
		String telefonoGrupo = request.getParameter("telefono");
		String rider = request.getParameter("rider");
		String componentes = request.getParameter("componentes");
		
		// TIPO SALA
		String nombreSala = request.getParameter("nombre");
		String emailSala = request.getParameter("email");
		String telefonoSala = request.getParameter("telefono");
		String direccionSala = request.getParameter("lugarSala");
		String aforo = request.getParameter("aforo");
		String condicionesContratacion = request.getParameter("condicionesContratacion");
		String equipoDisponible = request.getParameter("equipoDisponible");
		
		// TIPO FESTIVAL
		String nombreFestival = request.getParameter("nombre");
		String emailFestival = request.getParameter("email");
		String telefonoFestival = request.getParameter("telefono");
		String fechaInicioFestival = request.getParameter("fechaInicioFestival");
		String fechaFinFestival = request.getParameter("fechaFinFestival");
		String lugarFestival = request.getParameter("lugarFestival");
		String cartelFestival = request.getParameter("cartelFestival");
		String precio = request.getParameter("precio");
		String serviciosFestival = request.getParameter("serviciosFestival");
		String condiciones = request.getParameter("condiciones");
		
		// TIPO CONCURSO
		String nombreConcurso = request.getParameter("nombre");
		String emailConcurso = request.getParameter("email");
		String telefonoConcurso = request.getParameter("telefono");
		String fechaInicioConcurso = request.getParameter("fechaInicioConcurso");
		String fechaFinConcurso = request.getParameter("fechaFinConcurso");
		String inicioInscripcionConcurso = request.getParameter("inicioInscripcionConcurso");
		String finInscripcionConcurso = request.getParameter("finInscripcionConcurso");
		String precioInscripcion = request.getParameter("precioInscripcion");
		String premios = request.getParameter("premios");
		String lugarConcurso = request.getParameter("lugarConcurso");
		
		// Creamos el perfil segun el tipo y creamos el bo
		
		UsuarioBO usuarioBO = new UsuarioBO();
		PerfilBO perfilBO = new PerfilBO();
		
		if ( "1".equals(tipoPerfil) ){
			PerfilGrupo pGrupo = new PerfilGrupo();
			pGrupo.setNombre(nombreGrupo);
			pGrupo.setEmail(emailGrupo);
			pGrupo.setTelefono(telefonoGrupo);
			pGrupo.setRider(rider);
			pGrupo.setComponentes(componentes);
			
			// insertarmos el perfil TODO: los insert de los perfiles
			PerfilGrupo pInsertado = perfilBO.insertarPerfilGrupo(pGrupo);
			
			// ACtualizamos el perfil en la tabla de usuario
			Usuario usuarioSession = (Usuario) sesion.getAttribute("usuario");
			perfilBO.borrarPerfilGrupo(usuarioSession.getIdPerfil());
			usuarioSession.setIdTipo("1");
			usuarioSession.setIdPerfil(pInsertado.getIdPerfilGrupo());
			usuarioBO.actualizaUsuario(usuarioSession);
			sesion.setAttribute("usuario", usuarioSession);
			
		}
		
		if ( "2".equals(tipoPerfil) ){
			PerfilSala pSala = new PerfilSala();
			pSala.setNombre(nombreSala);
			pSala.setEmail(emailSala);
			pSala.setTelefono(telefonoSala);
			pSala.setAforoMaximo(Integer.parseInt(aforo));
			pSala.setCondiconesContratacion(condicionesContratacion);
			pSala.setDireccion(direccionSala);
			pSala.setEquipoDisponible(equipoDisponible);
			
			// insertarmos el perfil
			PerfilSala pInsertado = perfilBO.insertarPerfilSala(pSala);
			
			// ACtualizamos el perfil en la tabla de usuario
			Usuario usuarioSession = (Usuario) sesion.getAttribute("usuario");
			perfilBO.borrarPerfilGrupo(usuarioSession.getIdPerfil());
			usuarioSession.setIdTipo("2");
			usuarioSession.setIdPerfil(pInsertado.getIdPerfilSala());
			usuarioBO.actualizaUsuario(usuarioSession);
			sesion.setAttribute("usuario", usuarioSession);
			
		}
		
		if ( "3".equals(tipoPerfil) ){
			PerfilFestival pFestival = new PerfilFestival();
			pFestival.setNombre(nombreFestival);
			pFestival.setEmail(emailFestival);
			pFestival.setTelefono(telefonoFestival);
			pFestival.setCartel(cartelFestival);
			pFestival.setCondiciones(condiciones);
			pFestival.setInicioFestival(FuncionesImpl.getStringAsFecha(fechaInicioFestival));
			pFestival.setFinFestival(FuncionesImpl.getStringAsFecha(fechaFinFestival));
			pFestival.setLugar(lugarFestival);
			pFestival.setPrecio(Integer.parseInt(precio));
			pFestival.setCondiciones(condiciones);
			pFestival.setServiciosFestival(serviciosFestival);
			
			// insertarmos el perfil
			PerfilFestival pInsertado = perfilBO.insertarPerfilFestival(pFestival);
			
			// ACtualizamos el perfil en la tabla de usuario
			Usuario usuarioSession = (Usuario) sesion.getAttribute("usuario");
			perfilBO.borrarPerfilGrupo(usuarioSession.getIdPerfil());
			usuarioSession.setIdTipo("3");
			usuarioSession.setIdPerfil(pInsertado.getIdPerfilFestival());
			usuarioBO.actualizaUsuario(usuarioSession);
			sesion.setAttribute("usuario", usuarioSession);
			
		}
		
		if ( "4".equals(tipoPerfil) ){
			PerfilConcurso pConcurso = new PerfilConcurso();
			pConcurso.setNombre(nombreConcurso);
			pConcurso.setEmail(emailConcurso);
			pConcurso.setTelefono(telefonoConcurso);
			pConcurso.setInicioConcurso(FuncionesImpl.getStringAsFecha(fechaInicioConcurso));
			pConcurso.setFinConcurso(FuncionesImpl.getStringAsFecha(fechaFinConcurso));
			pConcurso.setPlazoInscripcion(inicioInscripcionConcurso+" - "+finInscripcionConcurso);
			pConcurso.setPrecioInscripcion(Integer.parseInt(precioInscripcion));
			pConcurso.setPremios(premios);
			pConcurso.setLugar(lugarConcurso);
			
			// insertarmos el perfil
			PerfilConcurso pInsertado = perfilBO.insertarPerfilConcurso(pConcurso);
			
			// ACtualizamos el perfil en la tabla de usuario
			Usuario usuarioSession = (Usuario) sesion.getAttribute("usuario");
			perfilBO.borrarPerfilGrupo(usuarioSession.getIdPerfil());
			usuarioSession.setIdTipo("4");
			usuarioSession.setIdPerfil(pInsertado.getIdPerfilConcurso());
			usuarioBO.actualizaUsuario(usuarioSession);
			sesion.setAttribute("usuario", usuarioSession);
			
		}
		
		NoticiaBO noticiaBO = new NoticiaBO();
		List<Noticia> noticias = noticiaBO.recuperarTodas();
		request.setAttribute("noticias", noticias);
		request.getRequestDispatcher("noticias.jsp").include(request,response);
		
	}

	private void crearUsuario(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		
		//RECUPERAMOS LAS VARIABLES DEL FORMULARIO
		String nick = request.getParameter("nickname");
		String password = request.getParameter("password");
		String idCiudad = request.getParameter("ciudades");
		
		// RECUPERAMOS LA SESSION SI EXISTE O LA CREAMOS SI NO EXISTE
		HttpSession sesion = request.getSession();
		
		// CREAMOS EL BO Y EL TO
		UsuarioBO userBO = new UsuarioBO();
		Usuario user = new Usuario();
		
		// HACEMOS LA VALIDACION EN SERVIDOR DE QUE LO QUE VENGA NO SEA VACIO
		if ( !"".equals(nick) && !"".equals(password)  ){
			
			// Comprobamos que no exista el usuario. Si es vacio es que no existe ese usuario
			Usuario usuarioNuevo = userBO.recuperarUsuarioByNick(nick);
			if ( usuarioNuevo == null ) {
				// Introducimos datos en el TO
				user.setNick(nick);
				user.setPassword(password);
				user.setIdPerfil("");
				user.setIdPerfil("");
				user.setAdmin("0");
				user.setIdCiudad(idCiudad);
				
				// Para la fecha de hoy
				java.util.Date today = new java.util.Date();
				java.sql.Date hoy = new java.sql.Date(today.getTime());	
				
				user.setFechaRegistro(hoy);
				user.setUltimaConexion(hoy);
				userBO.insertarUsuario(user);
				
				// ACTUALIZAMOS USUARIO RECIEN REGISTRADO PARA QUE ESTE EN SESSION CON TODOS SUS DATOS
				user = userBO.recuperarUsuarioByNick(nick);
				sesion.setAttribute("usuario", user);
				RequestDispatcher resq = request.getRequestDispatcher("nuevoPerfil.jsp");
				resq.forward(request, response);
			}else{
				request.getRequestDispatcher("usuarioExistente.html").include(request, response);
			}
		}
	}

	public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		HttpSession sesion = request.getSession();
		
		String idUser = request.getParameter("user");
		String password = request.getParameter("password");

		UsuarioBO userBO = new UsuarioBO();
		if ( idUser != null && password != null && !"".equals(idUser) && !"".equals(password) ){
			if ( userBO.comprobarLogin(idUser,password) ){
				Usuario user = userBO.recuperarUsuarioByNick(idUser);
				sesion.setAttribute("usuario", user);
				NoticiaBO noticiaBO = new NoticiaBO();
				List<Noticia> noticias = noticiaBO.recuperarTodas();
				request.setAttribute("noticias", noticias);
				request.getRequestDispatcher("noticias.jsp").include(request,response);
			}else{
				request.getRequestDispatcher("falloUsuario.html").include(request,response);
			}
		}
	}
	
	public void logout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		HttpSession sesion = request.getSession();
		Usuario usuario = (Usuario)sesion.getAttribute("usuario");
		UsuarioBO userBO = new UsuarioBO();
		java.util.Date today = new java.util.Date();
		java.sql.Date hoy = new java.sql.Date(today.getTime());	
		usuario.setUltimaConexion(hoy);
		userBO.actualizaUsuario(usuario);
		sesion.invalidate();
		request.getRequestDispatcher("index.html").include(request,response);
	}
	
	public void entradaNoLogueada(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		request.getRequestDispatcher("index2NoRegistrado.jsp").include(request,response);
	}
	
	public void registrarUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		CiudadBO ciudadBO = new CiudadBO();
		List<Ciudad> ciudades = ciudadBO.recuperarTodas();
		request.setAttribute("ciudades", ciudades);
		request.getRequestDispatcher("nuevoUsuario.jsp").include(request,response);
	}
}
